/*
 * @Author: wwssaabb
 * @Date: 2021-12-06 08:36:26
 * @LastEditTime: 2021-12-06 10:22:07
 * @FilePath: \handwritten-code\algorithm\回文数.js
 */
/* 
给你一个整数 x， 如果 x 是一个回文整数， 返回 true； 否则， 返回 false。
回文数是指正序（ 从左向右） 和倒序（ 从右向左） 读都是一样的整数。 例如， 121 是回文， 而 123 不是。

示例 1：

输入： x = 121
输出： true
示例 2：

输入： x = -121
输出： false
解释： 从左向右读, 为 - 121。 从右向左读, 为 121 - 。因此它不是一个回文数。

来源： 力扣（ LeetCode）
链接： https: //leetcode-cn.com/problems/palindrome-number
*/


//方法一，转字符串逆序再拼接判断
var isPalindrome = function (x) {
  return x.toString().split('').reverse().join('') === x.toString()
};

//方法二，中心扩散法
var isPalindrome = function (x) {
  let str = x.toString()
  const check = function (l, r) {
    while (l > 0 || r < str.length) {
      if (str[l] !== str[r]) return false
      l--
      r++
    }
    return true
  }
  //分两种情况，长度为奇数和长度为偶数,中心值不同，奇数同一个中心，偶数两个相邻中心
  let mid = Math.floor(str.length >> 1) //中间值，使用位运算右移一位，相当于Math.floor(x/2)
  return str.length & 1 ? check(mid, mid) : check(mid - 1, mid)
};

//方法三，两边数比较，不转字符串
var isPalindrome = function (x) {
  if (x < 0) return false
  let max = 1
  while (x / max > 10) { //获取最大位数
    max *= 10
  }
  while (x > 0) {
    if (parseInt(x / max) !== x % 10) return false
    x = parseInt(x % max / 10) //去掉左右两边的数
    max /= 100
  }
  return true
};

console.log(isPalindrome(1125211))

// console.time(1)
// console.log(123456789101111 % 2)
// console.timeEnd(1) //5.444ms
// console.time(2)
// console.log(123456789101111 & 1)
// console.timeEnd(2) //0.159ms